"""
@name : 6.装饰器带参数
@author : wenyao
@projectname: sanchuanglianxi
"""
import functools

#函数带参数
#建议闭包函数使用*args,**kwargs传递参数
#无论装饰的函数 需要什么参数  装饰器都可以去装饰他 比较通用

# def cost(func):
#     @functools.wraps(func)
#     def _cost(*args,**kwargs):
#         print("start.......")
#         func(*args,**kwargs)
#         print("end..........")
#     return _cost
#
# @cost
# def  func1(num1):
#     print("i am func1, this is num1:",num1)
#
# @cost
# def func2():
#     print("i am func2")
# @cost
# def func3(num1,num2,default = 1):
#     print(f"i am func3, num is {num1} {num2},default is {default}")
#
# func1(10)
# func2()
# func3(10,20,default=2)

#装饰器带参数
#装饰器带参数
# @dec(args)
# def func():
#     pass
#自身不传入参数的装饰器（采用两层函数定义装饰）
#自身传入参数的装饰器（采用三层函数定义装饰）

# def deco(arg):
#     def cost(func):
#         @functools.wraps(func)
#         def _cost(*args,**kwargs):
#             print("start.....")
#             ret = func(*args,**kwargs)
#             print(f"args is ...{arg}")
#             print("end........")
#             return ret
#         return _cost
#     return cost
#
# @deco(1)
# #cost = deco(1)
# #func1 = cost(func1)
# def func1():
#     print("i am func1")
#
# print(func1.__name__)

#使用带参数的装饰器 实现 username == root 的时候可以执行func 不等与root 提示没有权限

#通用装饰器  带/不带参数
def cost(func):
    #@functools.wraps(func)
    def _cost(*args,**kwargs):
        print("start.......")
        func(*args,**kwargs)
        print("end..........")
    #return _cost

@cost
#func2 = cost(func2)
def func2():
    pass

func2()
#print(func2.__name__)


import functools
def deco(decorated_= None,arg = None):
        def cost(func):
            @functools.wraps(func)
            def _cost(*args, **kwargs):
                if  arg == "root":
                    print("start.......")
                    ret = func(*args, **kwargs)
                    print("end.........")
                    return ret
                else:
                    print("没有权限")
            return _cost
        if decorated_:
            return cost(decorated_)
            #return _cost
        else:
            return cost

@deco(arg = "root") #---->此时decorated_ = None
##cost = deco(arg = "root")
#func1 = cost(func1)
#@deco()  ---->此时decorated_ = None
#cost = deco()
#func1 = cost(func1)
#@deco
#func1 = deco(func1)  -->此时decorated_ = func1 然后返回cost(decorated_) 类似不带参的双层装饰器调用
def func1():
    print("i am func1")

func1()

# def func3(a = 1, b = 2):
#     print(a,b)
#
# func3(3)